Micron Document
██████╗ ███████╗████████╗██╗██████╗ ███████╗██████╗ ██╗ █████╗
██╔══██╗██╔════╝╚══██╔══╝██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗
██████╔╝█████╗ ██║ ██║██████╔╝█████╗ ██║ ██║██║███████║
██╔══██╗██╔══╝ ██║ ██║██╔═══╝ ██╔══╝ ██║ ██║██║██╔══██║
██║ ██║███████╗ ██║ ██║██║ ███████╗██████╔╝██║██║ ██║
╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝


🬧 The NomadNet Encyclopedia | Archives | Info
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b

🔍 Search

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Printf
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
mwbamwbqprintf è una mwbgfunzione implementata nei mwbwlinguaggi di programmazione per visualizzare sullo mwcamwcqstandard output una mwcgstringa costruita in base ad un formato specificato. Tale funzione ha origine dal mwcwlinguaggio C, dove ha un mwdaprototipo simile al seguente:

int printf(const char *format, ...)

Il parametro mwhgformat è una stringa che descrive il formato da seguire nell'output e che utilizza delle sequenze mwhwsegnaposto, introdotte dal simbolo percentuale ("%"), per specificare la posizione relativa e il mwiatipo dei dati con cui comporre la stringa.

Per esempio, nel linguaggio C

printf("Colore %s, numero1 %d, numero2 %05d, hex %x, float %5.2f.\n",
"rosso", 123456, 89, 255, 3.14);

stamperà la seguente linea (escluso il carattere di nuova linea, mwow\n):

Colore rosso, numero1 123456, numero2 00089, hex ff, float 3.14.

La funzione printf restituisce il numero di caratteri stampati, o un mwpgnumero negativo se si è verificato un errore di output.

Anche il mwqaPerl ha la funzione mwqqprintf ma per la conversione usa caratteri differenti. mwqgPython ha una funzionalità analoga (l'operatore mwqw%). La libreria mwraGLib contiene la funzione mwrqg_print, un'implementazione di mwrgprintf.

I sistemi mwsaPOSIX dispongono di un programma denominato mwsqprintfcite-ref-1[1], utilizzabile ad esempio negli mwtgscript di mwtwshell; può essere impiegato in sostituzione del comando mwuamwuqecho in situazioni in cui quest'ultimo non sia mwugportabile.

Per esempio:

echo -n -e "$FOO\t$BAR'

può essere riscritto in modo portabile come:

printf '%s\t%s' "$FOO" "$BAR"

Anche il linguaggio mwwaPHP dispone della funzione mwwqprintf, uguale a quella del C/C++.
Nel programma mwwwMATLAB non è presente mwxaprintf, ma sono disponibili due sue estensioni: mwxqmwxgsprintf e mwxwmwyafprintf, che accettano la stessa sintassi nella stringa di formato.

Il linguaggio mwygJavaScript, nonostante sia un linguaggio di programmazione di tipologia curly bracket, non dispone di una funzione mwywprintf.

Contents

fprintf
sprintf
Note

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Funzioni derivate

Lo mwzwStandard mwaaC specifica alcune funzioni derivate da mwaqprintf che permettono di estenderne gli usi:

fprintf

int fprintf(FILE *stream, const char *format, ...)

mwggmwgwfprintf permette la scrittura dell'output su mwhafile. Questa funzione viene spesso impiegata per scrivere sullo mwhqmwhgstandard error o su mwhwfile di testo. In realtà può essere utilizzata per scrivere su qualsiasi file o stream aperto con la funzione mwiafopen, anche se l'utilizzo di mwigfprintf per la scrittura di dati binari può risultare problematica o quantomeno scomoda.

sprintf

int sprintf (char *str, const char *format, ...)

mwpqmwpgsprintf stampa su una stringa (mwpwarray di char) anziché sullo standard output. Gli utenti devono accertarsi, attraverso il calcolo o lo stack-smashing protection, che la stringa risultante non sia più lunga della memoria allocata per mwqastr. Non accertarsi di questo può causare un mwqqbuffer overflow.

È da notare che in mwqwPHP la funzione mwrasprintf non possiede l'argomento mwrqstr; al contrario, la funzione restituisce la stringa di output formattata.

Il prototipo della funzione in PHP è:

string sprintf (const string format, ...)

Un'alternativa sicura a sprintf

Come alternativa, molti ambienti forniscono la funzione mwvqmwvgsnprintf:

int snprintf(char *str, size_t size, const char *format, ...)

mw2wsnprintf garantisce di non scrivere più di mw3asize bytes in mw3qstr, in modo da evitare il rischio di un mw3gbuffer overflow, come nel codice seguente:

#define BUFFER_SIZE 50
char buf[BUFFER_SIZE];
int n;
...
n = snprintf(buf, BUFFER_SIZE, "Your name is %s.\n", username);
if (n < 0 || n >= BUFFER_SIZE)
/* Handle error */

Se mwaruusername nell'esempio precedente è più lungo di 50 caratteri, la funzione limiterà la stringa che viene salvata in mwarybuf troncando i caratteri finali. Ciò può sembrare indesiderabile, tuttavia preferibile ad avere una vulnerabilità di sicurezza, a cui un mwarcbuffer overflow può condurre spesso. Inoltre, il codice di ritorno della funzione mwargsnprintf indica quanti caratteri la funzione mwarkavrebbe scritto sulla stringa con spazio sufficiente. I sistemi possono usare questa informazione per allocare un nuovo buffer (più grande) se hanno bisogno di tutta la stringa non troncata.

mwarssnprintf non è parte del largamente implementato standard mwarwANSI C, come la mwar0sprintf. Tuttavia, entra a far parte del linguaggio con lo standard C99 e spesso era presente nelle librerie C anche prima di questo standard.

Un'altra alternativa sicura a mwar8sprintf è mwasamwaseasprintf:

int asprintf(char **ret, const char *format, ...)

mwatkasprintf alloca automaticamente memoria sufficiente per contenere la stringa finale. La funzione inizializza mwato*ret con un puntatore alla stringa risultante o con un valore indefinito se si verifica un errore (È da notare che la mwatsGlibc è l'unica implementazione che non sempre inizializza mwatw*ret a mwat0NULL nel caso in cui si verifichi un errore). Il programmatore, nell'usare la mwat4asprintf, ha la responsabilità di liberare la memoria allocata dopo l'uso. Sebbene non sia parte di alcuno standard, mwat8asprintf è inclusa nelle librerie C di molti mwauasistemi operativi (inclusi mwaueOpenBSD, mwauiFreeBSD e mwaumNetBSD).

vprintf, vfprintf, vsprintf, vsnprintf, and vasprintf

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
int vasprintf(char **ret, const char *format, va_list ap);

Queste funzioni sono analoghe a quelle precedenti senza la mwabyv, tranne che per il fatto di usare delle liste di argomenti variabili. Queste funzioni offrono la possibilità ai programmatori di creare le proprie varianti della mwabcprintf. Per esempio, un programmatore potrebbe scrivere una funzione

void fatal_error(const char *format, ...)

Che userebbe la macro mwackva_start per avere una variabile mwacova_list dai parametri extra, stampa un messaggio sul dispositivo di errore standard usando mwacsvfprintf, dopo la variabile mwacwva_list pulisce con la macro mwac0va_end, e alla fine esegue i compiti necessari per chiudere il programma liberando la memoria.

Un'altra applicazione comune di queste funzioni è scrivere un printf arbitrario che stampi su un oggetto diverso da un file. Una libreria grafica può fornire funzioni simili a printf con coordinate x e y:

int graphical_printf(int x, int y, const char *format, ...)

Questo salverebbe temporaneamente la stringa su un buffer privato usando mwaesvsnprintf o mwaewvasprintf.

Segnaposti del formato printf

La formattazione avviene attraverso segnaposti nella stringa di formato. Per esempio, se un programma vuole stampare l'età di una persona, può presentare l'output con il prefisso "la tua età è". Per specificare che vogliamo che l'mwae8integer dell'età venga stampato dopo il messaggio possiamo usare la forma:

"la tua eta' e' %d."

la sintassi del segnaposto di formato è "mwafi%[flag][larghezza][.precisione][lunghezza]tipo".

mwafqtipo può essere:

• 'd', 'i'mwafc : stampa un intero come mwafgdecimale con segno. '%d' e '%i' sono sinonimi per l'output, ma diversi se usati con mwafkscanf() per l'input;
• 'u'mwafs : stampa un intero come decimale senza segno;
• 'f', 'F'mwaf0 : Stampa un valore reale come un numero con virgola;
• 'e', 'E'mwaf8 : Stampa un valore reale nella forma esponenziale standard ([-]d.ddd e[+/-]ddd); 'e' usa la 'e' minuscola, 'E' usa la maiuscola;
• 'g', 'G'mwage : Stampa un valore reale con notazione reale o esponenziale, scegliendo quella più adatta alla sua dimensione. 'g' usa lettere minuscole, 'G' usa lettere maiuscole. Questa notazione è diversa dalla notazione con virgola perché gli zeri superflui alla destra del punto decimale non sono inclusi. Il punto decimale non è incluso nei numeri interi;
• 'x', 'X'mwagm : Stampa un intero senza segno come numero mwagqesadecimale. 'x' usa lettere minuscole e 'X' usa maiuscole;
• 'o'mwagy : Stampa un intero senza segno in base ottale;
• 's'mwagg : Stampa una mwagkstringa;
• 'c'mwags : Stampa un carattere;
• 'p'mwag0 : Stampa un puntatore a void, in un formato definito dall'implementazione;
• 'n'mwag8 : Scrivi il numero di caratteri finora scritti correttamente in un parametro puntatore a intero;
• '%'mwahe : stampa un carattere '%' (non accetta flag, precisione, lunghezza o larghezza).

I mwahmflag si possono omettere:

• '+'mwahy : Printf denota sempre il segno '+' o '-' di un numero (il default è omettere il segno per i numeri positivi). Solo per variabili numeriche.
• '-'mwahg : Printf allinea a sinistra l'output di questo segnaposto (il default è a destra).
• '#'mwaho : Forma alternata: con 'g' e 'G', gli zeri finali non sono rimossi; con 'f', 'F', 'e', 'E', 'g', 'G', l'output contiene sempre un punto decimale; con 'o', 'x', e 'X', vengono rispettivamente prefissi uno 0, 0x, o 0Xai numeri diversi da zero.
• ' 'mwahw : Fa inserire a printf spazi sulla sinistra dell'output fino al raggiungimento della larghezza richiesta. Se combinato con '0' (vedi sotto), farà diventare il segno uno spazio per i numeri positivi, ma gli altri caratteri saranno riempiti da zeri.
• '0'mwah4 : Fa usare a printf dei caratteri '0' (anziché spazi) a sinistra fino al raggiungimento di una certa larghezza. Per esempio, assumendo i = 3, printf("%2d", i) risulta in " 3", mentre printf("%02d", i) risulta in "03"

La mwaialarghezza può essere omessa, o essere:

• mwaimun numeromwaiq : printf mostra l'output di questo segnaposto con spazi finché è largo almeno mwaiunumero caratteri.
• '*'mwaic : printf espande l'output finché è largo mwaign caratteri, dove n è un valore intero memorizzato nel prossimo argomento. Per esempio printf("%*d", 5, 10) risulterà in "10" stampato con una larghezza pari a 5.

La mwaioprecisione può essere omessa, o essere:

• mwai0un numeromwai4 : Per i tipi numerici non interi (cioè a virgola mobile), la porzione decimale dell'output viene espressa con esattamente mwai8numero cifre. Con le stringhe, taglia l'output a mwajanumero caratteri.
• '*'mwaji : Come sopra, ma usa un valore intero nell'argomento successivo per determinare il numero di posizioni decimali o la massima lunghezza della stringa. Per esempio, printf("%.*s", 3, "abcdef") risulterà nella stampa di "abc".

La mwajqlunghezza può essere omessa, o essere:

• 'hh'mwajc : per i tipi interi, printf si attende un argomento lungo quanto un char;
• 'h'mwajk : per i tipi interi, printf si attende un argomento lungo quanto un intero corto;
• 'l'mwajs : mwajw(elle) per i tipi interi, printf si attende un argomento lungo quanto un intero lungo;
• 'll'mwaj4 : mwaj8(elle elle) per i tipi interi, printf si attende un argomento lungo quanto un intero lungo-lungo;
• 'L'mwake : per i tipi a virgola mobile, printf si attende un argomento lungo quanto un doppio lungo;
• 'z'mwakm : per i tipi interi, printf si attende un argomento lungo quanto un intero di tipo size_t;
• 'j': per i tipi interi, printf si attende un argomento lungo quanto un intero di tipo intmax_t;
• 't': per i tipi interi, printf si attende un argomento lungo quanto un intero di tipo ptrdiff_t.

Se la mwakcsintassi di una specifica di conversione non è valida, il comportamento non è definito. Se ci sono troppo pochi argomenti di funzione dati per fornire i valori per tutte le specifiche di conversione nella stringa di modello, o se gli argomenti non sono dei tipi giusti, i risultati non sono definiti. Gli argomenti in eccesso vengono ignorati. In alcuni casi il comportamento non definito ha portato ad mwakgattacchi contro la sicurezza basati sul formato della stringa. Nota che alcuni compilatori, come mwakkGCC, controlleranno alla compilazione le stringhe di formato di printf come fossero funzioni, e segnaleranno eventuali problemi.

La maggior parte dei linguaggi non-C hanno una funzione come mwaksprintf che lavorano usando il codice di formattazione "%s" e convertendo gli oggetti in testo. Il mwakwC++ offre un nuovo modo di eseguire printf. Il C++ infatti include la funzione printf in un nuovo meccanismo completamente diverso, che è generalmente preferito.

Linguaggi di programmazione con printf

• mwalaLinguaggio C, e di conseguenza mwaleC++ e mwaliObjective C
• mwalqBourne shell (sh) e le sue derivate come mwaluKorn shell (ksh), mwalyBourne again shell (bash), o mwalcZ shell (zsh)
• mwalkJava (dalla versione 1.5)
• mwalsRuby
• mwal0Python
• mwal8PHP
• mwamePerl
• mwammMATLAB
• mwamuGNU Octave
• mwamcMaple
• mwamkAMPL
• mwamsGo

Note

cite-note-11. mwani(mwanmmwanqEN) mwanumwanyprintf, in mwancThe Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008. mwangURL consultato il 30 marzo 2010.

Voci correlate

• mwanwFormat string
• mwaoiscanf

Collegamenti esterni

• citereffoldoc(EN) Denis Howe, printf, in Free On-line Dictionary of Computing. Disponibile con licenza mwaoyGFDL
• mwaog(EN) printf format specifications quick reference, su pixelbeat.org.
• mwaoo(EN) C printf() for Robotics, su societyofrobots.com.
• mwaow(EN) IEEE Std 1003.1, 2004, documentation for printf, su opengroup.org.
• mwao4(EN) C printf comparison page, su and.org.
• mwapa(EN) mwapeprintf(3) man page via mwapiOpenBSD